\chapter{Sistema Base}
\ifpdf
    \graphicspath{{Chapter1/Chapter1Figs/PNG/}{Chapter1/Chapter1Figs/PDF/}{Chapter1/Chapter1Figs/}}
\else
    \graphicspath{{Chapter1/Chapter1Figs/EPS/}{Chapter1/Chapter1Figs/}}
\fi

En este capítulo se definirá cada una de las partes que tendrá un sistema de archivos proxy.

\section{Descripción general del sistema}

En Linux el sistema de archivos proxy se monta en una ruta dentro del VFS (Virtual File System). Cuando una aplicacion accede a esta ruta se llama atravez del kernel al módulo de FUSE que a su vez llama al sistema de archivos proxy instalado en el espacio de usuario. El sistema de archivos proxy accede al sistema de archivos original atravez del VFS como se puede ver en la figura~(\ref{kernel}).

\InsertFig{\IncludeGraphicsH{kernel}{2in}{92 86 545 742}}{Comunicación con el kernel}{kernel}

El sistema de archivos proxy, entoces, se situa en medio de el sistema de archivos original y la aplicaciones de usuario como en la siguiente figura~(\ref{proxy}).

\InsertFig{\IncludeGraphicsH{proxy}{1.5in}{92 86 545 742}}{Sistema proxy}{proxy}

Para poder permitir una mayor modularización de un sistema de archivos proxy, se ha dividido este en varios componentes. Estos componentes son, en general, independientes unos de otros para permitir usarlos en diversas combinaciones~(\ref{general}).

\InsertFig{\IncludeGraphicsH{general}{3.5in}{92 86 545 742}}{Diseño general}{general}

En este gráfico se definen dos areas dentro del sistema de archivos proxy. La primera se define como ``Espacio de nombres original''. En esta área todos los componentes tratan a los archivos con sus nombres y rutas tal y como están en el sistema de archivos original. La segunda área se denomina``Espacio de nombres transformad''. En esta área se referencia a los archivos por su nombres y rutas una vez convertidas por el organizador.

De estos componentes solo la interfaz con FUSE es la única que no puede cambiar. Para el resto de componentes se tendrá diferentes implementaciones.


\section{Filtro}

Un filtro se encarga de escoger que partes del sistema de archivos original serán pasadas al organizador. La implementación más sencilla sería usar todo el sistema de archivos original. Se puede complicar un poco más pasando solamente un subdirectorio del sistema original o se puede llegar a filtros más complejos como el resultado de una busqueda o los archivos de musica que tengan en su metadata ciertas características.

\subsection{Detalles de la Implementación}

Los filtros se encuentran en el archivo \path{dejumblefs/filter.py}~(\ref{dejumblefs/filter.py}). Existe una clase base llamada FileListFilter que tiene un solo método público: filelist. Este método devuelve una lista de archivos y es únicamente llamado desde el cache. La lista que devuelve contiene items con el path completo dentro del VFS o un path relativo que comienza con ``./'' si el archivo se encuentra en el directorio original donde se montó el sistema de archivos proxy. Esto es necesario ya que una vez montado el sistema de archivos proxy cualquier llamada a su propio directorio accedería al sistema de archivos proxy y no al sistema original. Además recibe un parametro al momento de inicializarse: query. Este parámetro se lo define al momento de montar y puede ser usado por cualquier implementacion como información adicional para realizar el filtrado.


\section{Cache}

El cache se encarga de guardar o escribir los cambios en el sistema de archivos original. El cache más simple escribe directamente los cambios al sistema de archivos original. Un cache diferente podría simplemente escribir cualquier cambio a memoria y descartarlos cuando se desmonten. Además el cache sería el encargado de mantener la lista de archivos que se encuentran en el sistema de archivos proxy para que el organizador la lea.

\subsection{Detalles de la Implementación}

El código para este módulo se encuentra en el archivo \path{dejumblefs/cache.py}~(\ref{dejumblefs/cache.py}). Consiste en una clase base llamada Cache que provee un set de funciones para almacenar la lista de archivos que se encuentran en el sistema de archivos proxy. Además la implemetación por default provee todas las funciones necesarias para acceder al sistema de archivos original y a sus archivos. 


\section{Organizador}

Un organizador se encarga de tomar los archivos que fueron filtrados y los organiza en una estructura de directorios tradicional. El organizador puede ubicar un archivo en varias localizaciones de esta estructura. El organizador más simple sería el que presenta la estructura de directorios tal como se encontraban en el sistema original. Otro organizador muy simple sería el que presenta los archivos en la raiz del nuevo sistema de archivos. Organizadores más complejos podrían ser los que presentan los archivos traducidos usando alguna tabla de traducciones.

El organizador debe poder hacer un mapeo de los archivos en dos direcciones, es decir debe poder conocer el nombre de un archivo en el sistema nuevo dado el nombre del archivo en el sistema original y ademas poder hacerlo en la dirección contraria, saber el nombre del archivo en el sistema original dado el nombre del archivo en el nuevo sistema.

\subsection{Detalles de la Implementación}

En el archivo \path{dejumblefs/organizer.py}~(\ref{dejumblefs/organizer.py}) se encuentra una clase llamada Organizer. Esta clase implementa los métodos basicos para crear un organizador. Por un lado tenemos las funciones que son llamadas directamente desde el modulo de fuse: getattr y readdir. La implementacion básica de getattr funciones devuelve los mismos permisos del directorio donde fue montado el sistema de archivos proxy para el caso de directorios que no existen en el sistema original o devuelve los permisos tal y como estaban en el sistema original. La función readdir devuelve un lista de archivo para un directorio en especifico. Además de estas funciones existen varias funciones necesarias para generar un arbol de directorios nuevo basado en el arbol de directorios original y funciones para evitar conflictos en los nombres. Subclases deberían implementar dos funciones: paths y dirlist. paths devuelve una lista de paths dado un path en el sistema de archivos original. Esta funcion se llama cuando el sistema se inicializa o cuando el cache expira con todos los archivos que tiene la clase cache. dirlist devuelve una lista de archivos dado un directorio en el sistema de archivos proxy. Los directorios que devuelve dirlist deben ser solamente directorios que no existan en el sistema de archivos original pero que existan en el sistema de archivos proxy.


\section{Interfaz con FUSE}

Existe un pequeño numero de funciones que son necesarias implementar para tener un sistema de archivos:

\begin{itemize}
\item[fsinit] Inicializa el sistema de archivos. En este paso es necesario guardar un puntero al directorio donde estamos montando para poder acceder a esos datos en caso de que se necesite. Esta implementada en el archivo \path{dejumblefs/fs.py}~(\ref{dejumblefs/fs.py})
\item[getattr] Obtiene los atributos del archivo o directorio. Estos simplemente son pasados tal como los tiene el archivo o directorio original cuando se usa el cache por defecto.
\item[readdir] Obtiene una lista de archivos dado una ruta. Esta lista de archivos la tiene que devolver el organizador.
\item[readlink] Lee un link	y devuelve el path real.
\item[unlink] Elimina un archivo.
\item[rename] Cambia de nombre un archivo.
\item[chmod] Cambia permisos a un archivo.
\item[truncate] Corta la longitud de un archivo.
\item[utime] Actualiza la fecha de acceso al archivo.
\item[access] Prueba si se puede acceder al archivo.
\end{itemize}

Además existen ciertas operaciones que se utilizan para acceder y cambiar el contenido de un archivo:

\begin{itemize}
\item[read] Devuelve datos del archivo
\item[write] Escribe datos al archivo
\item[release] Cierra el archivo
\item[fsync] Sincroniza los datos con el disco o medio fisico
\item[flush] Envia los datos que se encuentren en un buffer
\item[fgetattr] Obtiene los atributos del archivo
\item[ftruncate] Corta la longitud de un archivo
\end{itemize}

% ------------------------------------------------------------------------


%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "../thesis"
%%% End: 
